#include <QtNetwork>
#include "nc.h"
#include "QMessageBox"
#include "ui_GUI.h"

#include <iostream>

using namespace std;

NC::NC(QWidget *parent) : QWidget(parent),
    ui(new Ui::NC)
{
    ui->setupUi(this);
   // this->showFullScreen();
    Init();
}

NC::~NC()
{
    delete ui;
}

void NC::Init(){
    QSettings settings("AIR", "SVE");
    settings.beginGroup("Fiscal1");
    QString gh =settings.value("password").toString();
    if(!settings.contains("password")||settings.value("password").toString()=="DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"){
        ui->widget_login->hide();
        ui->widget_main->show();
    }
    else{
        ui->widget_login->show();
        ui->widget_main->hide();
    }

    ui->widget_Activar->hide();
    ui->widget_configuracion->hide();
    ui->widget_dividir->hide();
    ui->widget_eliminar->hide();
    ui->widget_fiscales->hide();
    ui->widget_fusion->hide();
    ui->widget_ing_moc->hide();
    ui->widget_ing_padron->hide();
    ui->widget_ing_prop->hide();
    ui->widget_intranet->hide();
    ui->widget_nodos->hide();
    ui->widget_padron->hide();
    ui->widget_propuestas->hide();
    ui->widget_resultados->hide();
    ui->widget_registro->hide();
    ui->widget_votaciones->hide();

    P = new Padron();
    moc = new mociones();
    prop = new propuestas();

    connect(ui->button_propuestas,SIGNAL(clicked()),this,SLOT(W_propuestas()),Qt::UniqueConnection);
    connect(ui->button_padron,SIGNAL(clicked()),this,SLOT(W_padron()),Qt::UniqueConnection);
    connect(ui->button_votacion,SIGNAL(clicked()),this,SLOT(W_votaciones()),Qt::UniqueConnection);
    connect(ui->button_configuracion,SIGNAL(clicked()),this,SLOT(W_configuracion()),Qt::UniqueConnection);
    connect(ui->button_apagar,SIGNAL(clicked()),this,SLOT(close()),Qt::UniqueConnection);
    connect(ui->button_cerrar,SIGNAL(clicked()),this,SLOT(W_cerrar()),Qt::UniqueConnection);
    connect(ui->button_login_aceptar,SIGNAL(clicked()),this,SLOT(login_aceptar_button()),Qt::UniqueConnection);
    connect(ui->button_login_cerrar,SIGNAL(clicked()),this,SLOT(close()),Qt::UniqueConnection);
    connect(ui->lineEdit_login_password,SIGNAL(returnPressed()),this,SLOT(login_aceptar_button()),Qt::UniqueConnection);
}

void NC::login_aceptar_button(){
    if(ui->lineEdit_login_password->text().isEmpty()||ui->lineEdit_login_RFTag->text().isEmpty()){
        return;}
// Genera la funcion hash del password
    SHA sha;
    string output;

    sha.Update((byte const*)ui->lineEdit_login_password->text().toAscii().data(), ui->lineEdit_login_password->text().size());

    SecByteBlock sbbDigest(sha.DigestSize());

    sha.Final(sbbDigest.begin());
    HexEncoder enc(new StringSink(output));
    enc.Put(sbbDigest.begin(), sbbDigest.size());
    enc.MessageEnd();
// prueba con los datos del fiscal 1
    QSettings settings("AIR", "SVE");
    settings.beginGroup("Fiscal1");
    if(settings.value("RFTag").toString()==ui->lineEdit_login_RFTag->text()&&
       settings.value("password").toString()==QString::fromStdString(output)){
        ui->widget_login->hide();
        ui->widget_main->show();
        return;
    }
    settings.endGroup();
    settings.beginGroup("Fiscal2");
    if(settings.value("RFTag").toString()==ui->lineEdit_login_RFTag->text()&&
       settings.value("password").toString()==QString::fromStdString(output)){
        ui->widget_login->hide();
        ui->widget_main->show();
        return;
    }
    settings.endGroup();
    settings.beginGroup("backdoor");
    if(settings.value("RFTag").toString()==ui->lineEdit_login_RFTag->text()&&
       settings.value("password").toString()==QString::fromStdString(output)){
        ui->widget_login->hide();
        ui->widget_main->show();
        return;
    }
    settings.endGroup();
    show_msg("No se ha autenticado correctamente","","",QMessageBox::Critical);
    ui->lineEdit_login_password->clear();
    ui->lineEdit_login_RFTag->clear();
    ui->lineEdit_login_RFTag->setFocus();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SLOTs del menu principal
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::W_propuestas(){
    ui->widget_propuestas->show();
    ui->widget_main->hide();
    connect(ui->button_fusionar,SIGNAL(clicked()),this,SLOT(conex_fusion_prop()),Qt::UniqueConnection);
    connect(ui->button_ing_prop,SIGNAL(clicked()),this,SLOT(conex_ing_prop()),Qt::UniqueConnection);
    connect(ui->button_ing_moc,SIGNAL(clicked()),this,SLOT(conex_ing_moc()),Qt::UniqueConnection);
    connect(ui->button_dividir,SIGNAL(clicked()),this,SLOT(conex_div_prop()),Qt::UniqueConnection);
    connect(ui->button_eliminar,SIGNAL(clicked()),this,SLOT(conex_elim_prop()),Qt::UniqueConnection);
}

void NC::W_padron(){
    ui->widget_padron->show();
    ui->widget_main->hide();
    connect(ui->button_ing_padron,SIGNAL(clicked()),this,SLOT(conex_ing_padron()),Qt::UniqueConnection);
    connect(ui->button_registro,SIGNAL(clicked()),this,SLOT(conex_registro_asambleista()),Qt::UniqueConnection);
    connect(ui->button_reiniciar_sesion,SIGNAL(clicked()),this,SLOT(reiniciar_sesion()),Qt::UniqueConnection);
}

void NC::W_votaciones(){
    ui->widget_main->hide();
    ui->widget_votaciones->show();
    connect(ui->button_activar,SIGNAL(clicked()),this,SLOT(conex_activar()),Qt::UniqueConnection);
    connect(ui->button_resultados,SIGNAL(clicked()),this,SLOT(conex_resultados()),Qt::UniqueConnection);
}

void NC::W_configuracion(){
    ui->widget_configuracion->show();
    ui->widget_main->hide();
    connect(ui->button_restaurar,SIGNAL(clicked()),this,SLOT(restaurar_sistema()),Qt::UniqueConnection);
    connect(ui->button_fiscales,SIGNAL(clicked()),this,SLOT(conex_fiscales()),Qt::UniqueConnection);
    connect(ui->button_intranet,SIGNAL(clicked()),this,SLOT(conex_intranet()),Qt::UniqueConnection);
    connect(ui->button_nodos,SIGNAL(clicked()),this,SLOT(conex_nodos()),Qt::UniqueConnection);
}

void NC::W_cerrar(){
    ui->widget_login->show();
    ui->widget_main->hide();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SLOTs y funciones del menu de Control de Propuestas
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de ingreso de propuestas
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_ing_prop(){
    ui->widget_ing_prop->show();
    ui->widget_propuestas->hide();

    ui->label_prop_opc1->hide();
    ui->lineEdit_prop_opc1->hide();
    ui->label_prop_opc2->hide();
    ui->lineEdit_prop_opc2->hide();
    ui->checkBox_prop_opc3->hide();
    ui->lineEdit_prop_opc3->hide();
    ui->checkBox_prop_opc4->hide();
    ui->lineEdit_prop_opc4->hide();
    ui->checkBox_prop_opc5->hide();
    ui->lineEdit_prop_opc5->hide();

    ui->spinBox_propuesta->setValue(1);
    show_prop();

    connect(ui->radioButton_favor_contra,SIGNAL(clicked()),this,SLOT(favor_prop_checkBx()),Qt::UniqueConnection);
    connect(ui->radioButton_otras,SIGNAL(clicked()),this,SLOT(opciones_prop_checkBx()),Qt::UniqueConnection);
    connect(ui->checkBox_prop_opc3,SIGNAL(clicked()),this,SLOT(opc3_prop_checkBx()),Qt::UniqueConnection);
    connect(ui->checkBox_prop_opc4,SIGNAL(clicked()),this,SLOT(opc4_prop_checkBx()),Qt::UniqueConnection);
    connect(ui->checkBox_prop_opc5,SIGNAL(clicked()),this,SLOT(opc5_prop_checkBx()),Qt::UniqueConnection);
    connect(ui->button_prop_aceptar,SIGNAL(clicked()),this,SLOT(acept_prop_button()),Qt::UniqueConnection);
    connect(ui->button_prop_cancelar,SIGNAL(clicked()),this,SLOT(cancel_prop_button()),Qt::UniqueConnection);
    connect(ui->spinBox_propuesta,SIGNAL(valueChanged(int)),this,SLOT(show_prop()),Qt::UniqueConnection);
    connect(ui->comboBox_prop_subpropuesta,SIGNAL(currentIndexChanged(int)),this,SLOT(show_sub_prop()),Qt::UniqueConnection);
}

void NC::opciones_prop_checkBx()
{
    if(ui->radioButton_otras->isChecked()){
        tipo_voto=2;
        ui->label_prop_opc1->show();
        ui->lineEdit_prop_opc1->show();
        ui->lineEdit_prop_opc2->show();
        ui->label_prop_opc2->show();
        ui->checkBox_prop_opc3->show();
        ui->checkBox_prop_opc3->setChecked(false);
        ui->lineEdit_prop_opc3->show();
        ui->lineEdit_prop_opc3->setEnabled(false);
    }
}

void NC::opc3_prop_checkBx()
{
    if(ui->lineEdit_prop_opc2->text()=="" || ui->lineEdit_prop_opc1->text()=="" ){
        ui->checkBox_prop_opc3->setChecked(false);
        show_msg("Ingrese una descripcion para las<br>opciones 1 y 2 antes de habilitar<br>la opcion 3","","",QMessageBox::Warning);
    }
    else{
        show_prop_opc3();}
}

void NC::show_prop_opc3(){
    if(ui->checkBox_prop_opc3->isChecked()){
        tipo_voto=3;
        ui->lineEdit_prop_opc3->setEnabled(true);
        ui->checkBox_prop_opc4->show();
        ui->lineEdit_prop_opc4->show();
        ui->lineEdit_prop_opc4->setEnabled(false);
        ui->checkBox_prop_opc4->setChecked(false);
    }
    else{
        tipo_voto=2;
        ui->lineEdit_prop_opc3->setEnabled(false);
        //ui->lineEdit_prop_opc3->clear();
        ui->checkBox_prop_opc4->setChecked(false);
        //ui->lineEdit_prop_opc4->clear();
        ui->checkBox_prop_opc4->hide();
        ui->lineEdit_prop_opc4->hide();

        ui->checkBox_prop_opc5->setChecked(false);
        //ui->lineEdit_prop_opc5->clear();
        ui->checkBox_prop_opc5->hide();
        ui->lineEdit_prop_opc5->hide();}
}

void NC::opc4_prop_checkBx(){
    if(ui->lineEdit_prop_opc3->text()!=""){
        show_prop_opc4();}
    else{
        ui->checkBox_prop_opc4->setChecked(false);
        show_msg("Ingrese una descripcion para la opcion 3<br>antes de habilitar la opcion 4","","",QMessageBox::Warning);}
}

void NC::show_prop_opc4(){
    if(ui->checkBox_prop_opc4->isChecked()){
        tipo_voto=4;
        ui->lineEdit_prop_opc4->setEnabled(true);

        ui->checkBox_prop_opc5->show();
        ui->lineEdit_prop_opc5->show();
        ui->lineEdit_prop_opc5->setEnabled(false);
        ui->checkBox_prop_opc5->setChecked(false);
    }
    else{
        tipo_voto=3;
        ui->lineEdit_prop_opc4->setEnabled(false);
        //ui->lineEdit_prop_opc4->clear();

        ui->checkBox_prop_opc5->setChecked(false);
        //ui->lineEdit_prop_opc5->clear();
        ui->checkBox_prop_opc5->hide();
        ui->lineEdit_prop_opc5->hide();}
}

void NC::opc5_prop_checkBx()
{
    if(ui->lineEdit_prop_opc4->text()!=""){
        show_prop_opc5();}
    else{
        ui->checkBox_prop_opc5->setChecked(false);
        show_msg("Ingrese una descripcion para la opcion 4<br>antes de habilitar la opcion 5","","",QMessageBox::Warning);}
}

void NC::show_prop_opc5(){
    if(ui->checkBox_prop_opc5->isChecked()){
        tipo_voto=5;
        ui->lineEdit_prop_opc5->setEnabled(true);
    }
    else{
        tipo_voto=4;
        ui->lineEdit_prop_opc5->setEnabled(false);
        //ui->lineEdit_prop_opc5->clear();
    }
}

void NC::acept_prop_button(){
    if(prop->search_prop(ui->spinBox_propuesta->text())){
        switch (show_msg("El numero de propuesta ya existe!",
                        "Desea sobreescribir la propuesta?",
                        "",
                        QMessageBox::Warning,
                        QMessageBox::No|QMessageBox::Yes)){
            case QMessageBox::Yes:
                break;
            case QMessageBox::No:
                return;
        };

        if(prop->isVoted(ui->spinBox_propuesta->text(),ui->comboBox_prop_subpropuesta->currentText())){
            switch (show_msg("Esta propuesta ya fue votada!",
                            "Si continua con esta operacion, se perderan todos los datos. Desea continuar?",
                            "",
                            QMessageBox::Critical,
                            QMessageBox::No | QMessageBox::Yes)){
                case QMessageBox::Yes:{
                    QString cmd("rm -r Propuesta_");
                    cmd.append(ui->spinBox_propuesta->text());
                    if(!ui->comboBox_prop_subpropuesta->isHidden())
                        cmd.append("-").append(ui->comboBox_prop_subpropuesta->currentText());
                    system(cmd.toAscii().data());
                }
                    break;
                case QMessageBox::No:
                    return;
            };
        }
    }

    switch(tipo_voto){
        case 1:{
            if(ui->lineEdit_prop_desc->text().isEmpty()){
                show_msg("No se puede guardar la propuesta!","Verifique que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList propuesta;
            propuesta << ui->spinBox_propuesta->text() << ui->comboBox_prop_subpropuesta->currentText();
            propuesta << ui->lineEdit_prop_desc->text() << QString::number(tipo_voto);
            propuesta << "" << "" << "" << "" << "";
            prop->ing_prop(&propuesta);
            break;}
        case 2:{
            if(ui->lineEdit_prop_desc->text().isEmpty() ||
               ui->lineEdit_prop_opc1->text().isEmpty() ||
               ui->lineEdit_prop_opc2->text().isEmpty()){
                show_msg("No se puede guardar la propuesta!","Verifique que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList propuesta;
            propuesta << ui->spinBox_propuesta->text() << ui->comboBox_prop_subpropuesta->currentText();
            propuesta << ui->lineEdit_prop_desc->text() << QString::number(tipo_voto);
            propuesta << ui->lineEdit_prop_opc1->text() << ui->lineEdit_prop_opc2->text() << "" << "" << "";
            prop->ing_prop(&propuesta);
            break;}
        case 3:{
            if(ui->lineEdit_prop_desc->text().isEmpty() ||
               ui->lineEdit_prop_opc1->text().isEmpty() ||
               ui->lineEdit_prop_opc2->text().isEmpty() ||
               ui->lineEdit_prop_opc3->text().isEmpty()){
                show_msg("No se puede guardar la propuesta!","Verifique que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList propuesta;
            propuesta << ui->spinBox_propuesta->text() << ui->comboBox_prop_subpropuesta->currentText();
            propuesta << ui->lineEdit_prop_desc->text() << QString::number(tipo_voto);
            propuesta << ui->lineEdit_prop_opc1->text() << ui->lineEdit_prop_opc2->text();
            propuesta << ui->lineEdit_prop_opc3->text() << "" << "";
            prop->ing_prop(&propuesta);
            break;}
        case 4:{
            if(ui->lineEdit_prop_desc->text().isEmpty() ||
               ui->lineEdit_prop_opc1->text().isEmpty() ||
               ui->lineEdit_prop_opc2->text().isEmpty() ||
               ui->lineEdit_prop_opc3->text().isEmpty() ||
               ui->lineEdit_prop_opc4->text().isEmpty()){
                show_msg("No se puede guardar la propuesta!","Verifique que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList propuesta;
            propuesta << ui->spinBox_propuesta->text() << ui->comboBox_prop_subpropuesta->currentText();
            propuesta << ui->lineEdit_prop_desc->text() << QString::number(tipo_voto);
            propuesta << ui->lineEdit_prop_opc1->text() << ui->lineEdit_prop_opc2->text();
            propuesta << ui->lineEdit_prop_opc3->text() << ui->lineEdit_prop_opc4->text()<< "";
            prop->ing_prop(&propuesta);
            break;}
        case 5:{
            if(ui->lineEdit_prop_desc->text().isEmpty() ||
               ui->lineEdit_prop_opc1->text().isEmpty() ||
               ui->lineEdit_prop_opc2->text().isEmpty() ||
               ui->lineEdit_prop_opc3->text().isEmpty() ||
               ui->lineEdit_prop_opc4->text().isEmpty() ||
               ui->lineEdit_prop_opc5->text().isEmpty()){
                show_msg("No se puede guardar la propuesta!","Verifique que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList propuesta;
            propuesta << ui->spinBox_propuesta->text() << ui->comboBox_prop_subpropuesta->currentText();
            propuesta << ui->lineEdit_prop_desc->text() << QString::number(tipo_voto);
            propuesta << ui->lineEdit_prop_opc1->text() << ui->lineEdit_prop_opc2->text();
            propuesta << ui->lineEdit_prop_opc3->text() << ui->lineEdit_prop_opc4->text();
            propuesta << ui->lineEdit_prop_opc5->text();
            prop->ing_prop(&propuesta);
            break;}
    }

    show_msg("La propuesta se ha guardado satisfactoriamente");
    ui->widget_ing_prop->hide();
    ui->widget_propuestas->show();
}

void NC::cancel_prop_button(){
    ui->lineEdit_prop_opc3->setEnabled(false);
    ui->lineEdit_prop_opc3->clear();
    ui->checkBox_prop_opc4->setChecked(false);
    ui->lineEdit_prop_opc4->clear();
    ui->checkBox_prop_opc5->setChecked(false);
    ui->lineEdit_prop_opc5->clear();
    ui->lineEdit_prop_desc->clear();

    ui->radioButton_otras->setChecked(false);
    ui->radioButton_favor_contra->setChecked(false);

    ui->widget_ing_prop->hide();
    ui->widget_propuestas->show();
}

void NC::favor_prop_checkBx(){
    if(ui->radioButton_favor_contra->isChecked()){
        tipo_voto=1;
        //ui->spinBox_subpropuesta->setValue(0);
        ui->lineEdit_prop_opc1->clear();
        ui->lineEdit_prop_opc2->clear();
        ui->lineEdit_prop_opc3->clear();
        ui->lineEdit_prop_opc4->clear();
        ui->lineEdit_prop_opc5->clear();
        ui->label_prop_opc1->hide();
        ui->lineEdit_prop_opc1->hide();
        ui->label_prop_opc2->hide();
        ui->lineEdit_prop_opc2->hide();
        ui->checkBox_prop_opc3->hide();
        ui->lineEdit_prop_opc3->hide();
        ui->checkBox_prop_opc4->hide();
        ui->lineEdit_prop_opc4->hide();
        ui->checkBox_prop_opc5->hide();
        ui->lineEdit_prop_opc5->hide();
    }
}

void NC::show_prop(){
    QStringList propuesta;

    ui->lineEdit_prop_desc->clear();
    ui->lineEdit_prop_opc1->clear();
    ui->lineEdit_prop_opc2->clear();
    ui->lineEdit_prop_opc3->clear();
    ui->lineEdit_prop_opc4->clear();
    ui->lineEdit_prop_opc5->clear();

    if(!prop->search_prop(ui->spinBox_propuesta->text())){
        ui->comboBox_prop_subpropuesta->hide();
        ui->comboBox_prop_subpropuesta->clear();
        ui->lineEdit_prop_desc->clear();
        ui->radioButton_favor_contra->setChecked(true);
        favor_prop_checkBx();
        return;
    }
    else{
        prop->propuesta(ui->spinBox_propuesta->text(),propuesta);

        if(!QString(propuesta.at(0)).isEmpty()){
            ui->comboBox_prop_subpropuesta->show();
            ui->comboBox_prop_subpropuesta->clear();
            ui->comboBox_prop_subpropuesta->insertItems(0,prop->lista_subpropuestas(ui->spinBox_propuesta->text()));
        }
        else{
            ui->comboBox_prop_subpropuesta->hide();
            ui->comboBox_prop_subpropuesta->clear();
        }
    }

    ui->lineEdit_prop_desc->setText(propuesta.at(1));
    switch(QString(propuesta.at(2)).toInt()){
        case 1:{
            ui->radioButton_favor_contra->setChecked(true);
            favor_prop_checkBx();}
            break;
        case 2:{
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(false);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(false);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(propuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(propuesta.at(3));
            ui->lineEdit_prop_opc2->setText(propuesta.at(4));}
            break;
        case 3:{
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(false);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(propuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(propuesta.at(3));
            ui->lineEdit_prop_opc2->setText(propuesta.at(4));
            ui->lineEdit_prop_opc3->setText(propuesta.at(5));}
            break;
        case 4:{
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(true);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(propuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(propuesta.at(3));
            ui->lineEdit_prop_opc2->setText(propuesta.at(4));
            ui->lineEdit_prop_opc3->setText(propuesta.at(5));
            ui->lineEdit_prop_opc4->setText(propuesta.at(6));}
            break;
        case 5:{
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(true);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(true);
            show_prop_opc5();

            tipo_voto=QString(propuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(propuesta.at(3));
            ui->lineEdit_prop_opc2->setText(propuesta.at(4));
            ui->lineEdit_prop_opc3->setText(propuesta.at(5));
            ui->lineEdit_prop_opc4->setText(propuesta.at(6));
            ui->lineEdit_prop_opc5->setText(propuesta.at(7));}
            break;
    }
}

void NC::show_sub_prop(){
    QStringList subpropuesta;
    prop->subpropuesta(ui->spinBox_propuesta->text(),ui->comboBox_prop_subpropuesta->currentText(),subpropuesta);

    ui->lineEdit_prop_desc->clear();
    ui->lineEdit_prop_opc1->clear();
    ui->lineEdit_prop_opc2->clear();
    ui->lineEdit_prop_opc3->clear();
    ui->lineEdit_prop_opc4->clear();
    ui->lineEdit_prop_opc5->clear();

    ui->lineEdit_prop_desc->setText(subpropuesta.at(1));
    switch(QString(subpropuesta.at(2)).toInt()){
        case 1:
            ui->radioButton_favor_contra->setChecked(true);
            favor_prop_checkBx();
            break;
        case 2:
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(false);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(false);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(subpropuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(subpropuesta.at(3));
            ui->lineEdit_prop_opc2->setText(subpropuesta.at(4));
            break;
        case 3:
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(false);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(subpropuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(subpropuesta.at(3));
            ui->lineEdit_prop_opc2->setText(subpropuesta.at(4));
            ui->lineEdit_prop_opc3->setText(subpropuesta.at(5));
            break;
        case 4:
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(true);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(false);
            show_prop_opc5();

            tipo_voto=QString(subpropuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(subpropuesta.at(3));
            ui->lineEdit_prop_opc2->setText(subpropuesta.at(4));
            ui->lineEdit_prop_opc3->setText(subpropuesta.at(5));
            ui->lineEdit_prop_opc4->setText(subpropuesta.at(6));
            break;
        case 5:
            ui->radioButton_otras->setChecked(true);
            opciones_prop_checkBx();
            ui->checkBox_prop_opc3->setChecked(true);
            show_prop_opc3();
            ui->checkBox_prop_opc4->setChecked(true);
            show_prop_opc4();
            ui->checkBox_prop_opc5->setChecked(true);
            show_prop_opc5();

            tipo_voto=QString(subpropuesta.at(2)).toInt();
            ui->lineEdit_prop_opc1->setText(subpropuesta.at(3));
            ui->lineEdit_prop_opc2->setText(subpropuesta.at(4));
            ui->lineEdit_prop_opc3->setText(subpropuesta.at(5));
            ui->lineEdit_prop_opc4->setText(subpropuesta.at(6));
            ui->lineEdit_prop_opc5->setText(subpropuesta.at(7));
            break;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de ingreso de mociones
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_ing_moc(){
    ui->widget_propuestas->hide();
    ui->widget_ing_moc->show();

    ui->comboBox_moc_submocion->clear();
    ui->comboBox_moc_submocion->hide();

    ui->comboBox_moc_tipo->clear();
    ui->comboBox_moc_tipo->insertItems(0,QStringList() << "Orden" <<"Forma" << "Fondo" << "Revision");

    ui->label_moc_opc1->hide();
    ui->label_moc_opc2->hide();

    ui->checkBox_moc_opc3->hide();
    ui->checkBox_moc_opc4->hide();
    ui->checkBox_moc_opc5->hide();

    ui->lineEdit_moc_opc1->hide();
    ui->lineEdit_moc_opc2->hide();
    ui->lineEdit_moc_opc3->hide();
    ui->lineEdit_moc_opc4->hide();
    ui->lineEdit_moc_opc5->hide();
    ui->spinBox_moc_mocion->setValue(1);
    show_moc();

    connect(ui->radioButton_moc_otras,SIGNAL(clicked()),this,SLOT(opciones_moc()),Qt::UniqueConnection);
    connect(ui->radioButton_moc_favor_contra,SIGNAL(clicked()),this,SLOT(favor_moc()),Qt::UniqueConnection);
    connect(ui->button_moc_aceptar,SIGNAL(clicked()),this,SLOT(acept_moc_button()),Qt::UniqueConnection);
    connect(ui->button_moc_cancelar,SIGNAL(clicked()),this,SLOT(cancel_moc_button()),Qt::UniqueConnection);
    connect(ui->spinBox_moc_mocion,SIGNAL(valueChanged(int)),this,SLOT(show_moc()),Qt::UniqueConnection);
    connect(ui->checkBox_moc_opc3,SIGNAL(clicked()),this,SLOT(opc3_moc_checkBx()),Qt::UniqueConnection);
    connect(ui->checkBox_moc_opc4,SIGNAL(clicked()),this,SLOT(opc4_moc_checkBx()),Qt::UniqueConnection);
    connect(ui->checkBox_moc_opc5,SIGNAL(clicked()),this,SLOT(opc5_moc_checkBx()),Qt::UniqueConnection);
    connect(ui->comboBox_moc_submocion,SIGNAL(currentIndexChanged(int)),this,SLOT(show_sub_moc()),Qt::UniqueConnection);
}

void NC::show_moc(){
    QStringList mocion;

    ui->lineEdit_moc_desc->clear();
    ui->lineEdit_moc_opc1->clear();
    ui->lineEdit_moc_opc2->clear();
    ui->lineEdit_moc_opc3->clear();
    ui->lineEdit_moc_opc4->clear();
    ui->lineEdit_moc_opc5->clear();

    ui->comboBox_moc_tipo->setCurrentIndex(-1);

    if(!moc->search_moc(ui->spinBox_moc_mocion->text())){
        ui->comboBox_moc_submocion->hide();
        ui->comboBox_moc_submocion->clear();
        ui->lineEdit_moc_desc->clear();
        ui->comboBox_moc_tipo->setEnabled(true);
        ui->radioButton_moc_favor_contra->setChecked(true);
        favor_moc();
        return;
    }
    else{
        moc->mocion(ui->spinBox_moc_mocion->text(),mocion);
        if(!QString(mocion.at(0)).isEmpty()){
            ui->comboBox_moc_submocion->show();
            ui->comboBox_moc_submocion->clear();
            ui->comboBox_moc_submocion->insertItems(0,moc->lista_submociones(ui->spinBox_moc_mocion->text()));
            ui->comboBox_moc_tipo->setEnabled(false);
        }
        else{
            ui->comboBox_moc_submocion->hide();
            ui->comboBox_moc_submocion->clear();
            ui->comboBox_moc_tipo->setEnabled(true);
        }
    }

    ui->comboBox_moc_tipo->setCurrentIndex(ui->comboBox_moc_tipo->findText(mocion.at(8)));
    ui->lineEdit_moc_desc->setText(mocion.at(1));

    switch(QString(mocion.at(2)).toInt()){
    case 1:{
            ui->radioButton_moc_favor_contra->setChecked(true);
            favor_moc();}
            break;
    case 2:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(false);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(false);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();
            tipo_voto=QString(mocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(mocion.at(3));
            ui->lineEdit_moc_opc2->setText(mocion.at(4));}
            break;
    case 3:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(false);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();
            tipo_voto=QString(mocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(mocion.at(3));
            ui->lineEdit_moc_opc2->setText(mocion.at(4));
            ui->lineEdit_moc_opc3->setText(mocion.at(5));}
            break;
    case 4:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(true);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();
            tipo_voto=QString(mocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(mocion.at(3));
            ui->lineEdit_moc_opc2->setText(mocion.at(4));
            ui->lineEdit_moc_opc3->setText(mocion.at(5));
            ui->lineEdit_moc_opc4->setText(mocion.at(6));}
            break;
    case 5:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(true);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(true);
            show_moc_opc5();
            tipo_voto=QString(mocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(mocion.at(3));
            ui->lineEdit_moc_opc2->setText(mocion.at(4));
            ui->lineEdit_moc_opc3->setText(mocion.at(5));
            ui->lineEdit_moc_opc4->setText(mocion.at(6));
            ui->lineEdit_moc_opc5->setText(mocion.at(7));}
            break;
    }
}

void NC::show_sub_moc(){

    QStringList submocion;
    moc->submocion(ui->spinBox_moc_mocion->text(),ui->comboBox_moc_submocion->currentText(),submocion);

    ui->lineEdit_moc_desc->clear();
    ui->lineEdit_moc_opc1->clear();
    ui->lineEdit_moc_opc2->clear();
    ui->lineEdit_moc_opc3->clear();
    ui->lineEdit_moc_opc4->clear();
    ui->lineEdit_moc_opc5->clear();

    ui->lineEdit_moc_desc->setText(submocion.at(1));

    switch(QString(submocion.at(2)).toInt()){
        case 1:{
            ui->radioButton_moc_favor_contra->setChecked(true);
            favor_moc();}
            break;
        case 2:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(false);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(false);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();

            tipo_voto=QString(submocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(submocion.at(3));
            ui->lineEdit_moc_opc2->setText(submocion.at(4));}
            break;
        case 3:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(false);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();

            tipo_voto=QString(submocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(submocion.at(3));
            ui->lineEdit_moc_opc2->setText(submocion.at(4));
            ui->lineEdit_moc_opc3->setText(submocion.at(5));}
            break;
        case 4:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(true);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(false);
            show_moc_opc5();

            tipo_voto=QString(submocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(submocion.at(3));
            ui->lineEdit_moc_opc2->setText(submocion.at(4));
            ui->lineEdit_moc_opc3->setText(submocion.at(5));
            ui->lineEdit_moc_opc4->setText(submocion.at(6));}
            break;
        case 5:{
            ui->radioButton_moc_otras->setChecked(true);
            opciones_moc();
            ui->checkBox_moc_opc3->setChecked(true);
            show_moc_opc3();
            ui->checkBox_moc_opc4->setChecked(true);
            show_moc_opc4();
            ui->checkBox_moc_opc5->setChecked(true);
            show_moc_opc5();

            tipo_voto=QString(submocion.at(2)).toInt();
            ui->lineEdit_moc_opc1->setText(submocion.at(3));
            ui->lineEdit_moc_opc2->setText(submocion.at(4));
            ui->lineEdit_moc_opc3->setText(submocion.at(5));
            ui->lineEdit_moc_opc4->setText(submocion.at(6));
            ui->lineEdit_moc_opc5->setText(submocion.at(7));}
            break;
    }
}

void NC::opc3_moc_checkBx()
{
    if(ui->lineEdit_moc_opc2->text()=="" || ui->lineEdit_moc_opc1->text()=="" ){
        ui->checkBox_moc_opc3->setChecked(false);
        show_msg("Ingrese una descripcion para las<br>opciones 1 y 2 antes de habilitar<br>la opcion 3","","",QMessageBox::Warning);
    }
    else{
        show_moc_opc3();}
}

void NC::opc4_moc_checkBx()
{
    if(ui->lineEdit_moc_opc3->text()!=""){
        show_moc_opc4();}
    else{
        ui->checkBox_moc_opc4->setChecked(false);
        show_msg("Ingrese una descripcion para la opcion 3<br>antes de habilitar la opcion 4","","",QMessageBox::Warning);}
}

void NC::opc5_moc_checkBx()
{
    if(ui->lineEdit_moc_opc4->text()!=""){
        show_moc_opc5();}
    else{
        ui->checkBox_moc_opc5->setChecked(false);
        show_msg("Ingrese una descripcion para la opcion 4<br>antes de habilitar la opcion 5","","",QMessageBox::Warning);}
}

void NC::acept_moc_button(){
    if(moc->search_moc(ui->spinBox_moc_mocion->text())){
        switch (show_msg("El numero de mocion ya existe!",
                         "Desea sobreescribir la mocion?",
                         "",
                         QMessageBox::Warning,
                         QMessageBox::No|QMessageBox::Yes)){
            case QMessageBox::Yes:
                break;
            case QMessageBox::No:
                return;
        };

        if(moc->isVoted(ui->spinBox_moc_mocion->text(),ui->comboBox_moc_submocion->currentText())){
            switch (show_msg("Esta mocion ya fue votada!",
                             "Si continua con esta operacion, se perderan todos los datos. Desea continuar?",
                             "",
                             QMessageBox::Critical,
                             QMessageBox::No | QMessageBox::Yes)){
                case QMessageBox::Yes:{
                    QString cmd("rm -r Mocion_");
                    cmd.append(ui->spinBox_moc_mocion->text());
                    if(!ui->comboBox_moc_submocion->isHidden()){
                        cmd.append("-").append(ui->comboBox_moc_submocion->currentText());}
                    system(cmd.toAscii().data());
                    }
                    break;
                case QMessageBox::No:
                    return;
            };
        }
}

    switch(tipo_voto){
        case 1:{
            if(ui->lineEdit_moc_desc->text().isEmpty()||
               ui->comboBox_moc_tipo->currentIndex()==-1){
                show_msg("No se puede guardar la mocion!","Verifique que ha seleccionado el tipo<br>de mocion y que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList mocion;
            mocion << ui->comboBox_moc_tipo->currentText() << ui->spinBox_moc_mocion->text() << ui->comboBox_moc_submocion->currentText();
            mocion << ui->lineEdit_moc_desc->text() << QString::number(tipo_voto);
            mocion << "" << "" << "" << "" << "";
            moc->ing_moc(&mocion);
            break;}
        case 2:{
            if(ui->lineEdit_moc_desc->text().isEmpty() ||
               ui->comboBox_moc_tipo->currentIndex()==-1 ||
               ui->lineEdit_moc_opc1->text().isEmpty() ||
               ui->lineEdit_moc_opc2->text().isEmpty()){
                show_msg("No se puede guardar la mocion!","Verifique que ha seleccionado el tipo<br>de mocion y que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList mocion;
            mocion << ui->comboBox_moc_tipo->currentText() << ui->spinBox_moc_mocion->text() << ui->comboBox_moc_submocion->currentText();
            mocion << ui->lineEdit_moc_desc->text() << QString::number(tipo_voto);
            mocion << ui->lineEdit_moc_opc1->text() << ui->lineEdit_moc_opc2->text() << "" << "" << "";
            moc->ing_moc(&mocion);
            break;}
        case 3:{
            if(ui->lineEdit_moc_desc->text().isEmpty() ||
               ui->comboBox_moc_tipo->currentIndex()==-1 ||
               ui->lineEdit_moc_opc1->text().isEmpty() ||
               ui->lineEdit_moc_opc2->text().isEmpty() ||
               ui->lineEdit_moc_opc3->text().isEmpty()){
                show_msg("No se puede guardar la mocion!","Verifique que ha seleccionado el tipo<br>de mocion y que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList mocion;
            mocion << ui->comboBox_moc_tipo->currentText() << ui->spinBox_moc_mocion->text() << ui->comboBox_moc_submocion->currentText();
            mocion << ui->lineEdit_moc_desc->text() << QString::number(tipo_voto);
            mocion << ui->lineEdit_moc_opc1->text() << ui->lineEdit_moc_opc2->text();
            mocion << ui->lineEdit_moc_opc3->text() << "" << "";
            moc->ing_moc(&mocion);
            break;}
        case 4:{
            if(ui->lineEdit_moc_desc->text().isEmpty() ||
               ui->comboBox_moc_tipo->currentIndex()==-1 ||
               ui->lineEdit_moc_opc1->text().isEmpty() ||
               ui->lineEdit_moc_opc2->text().isEmpty() ||
               ui->lineEdit_moc_opc3->text().isEmpty() ||
               ui->lineEdit_moc_opc4->text().isEmpty()){
                show_msg("No se puede guardar la mocion!","Verifique que ha seleccionado el tipo<br>de mocion y que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList mocion;
            mocion << ui->comboBox_moc_tipo->currentText() << ui->spinBox_moc_mocion->text() << ui->comboBox_moc_submocion->currentText();
            mocion << ui->lineEdit_moc_desc->text() << QString::number(tipo_voto);
            mocion << ui->lineEdit_moc_opc1->text() << ui->lineEdit_moc_opc2->text();
            mocion << ui->lineEdit_moc_opc3->text() << ui->lineEdit_moc_opc4->text()<< "";
            moc->ing_moc(&mocion);
            break;}
        case 5:{
            if(ui->lineEdit_moc_desc->text().isEmpty() ||
               ui->comboBox_moc_tipo->currentIndex()==-1 ||
               ui->lineEdit_moc_opc1->text().isEmpty() ||
               ui->lineEdit_moc_opc2->text().isEmpty() ||
               ui->lineEdit_moc_opc3->text().isEmpty() ||
               ui->lineEdit_moc_opc4->text().isEmpty() ||
               ui->lineEdit_moc_opc5->text().isEmpty()){
                show_msg("No se puede guardar la mocion!","Verifique que ha seleccionado el tipo<br>de mocion y que todos los campos<br>habilitados se encuentran ocupados,<br>o modifique el tipo de votacion","",QMessageBox::Critical);
                return;
            }
            QStringList mocion;
            mocion << ui->comboBox_moc_tipo->currentText() << ui->spinBox_moc_mocion->text() << ui->comboBox_moc_submocion->currentText();
            mocion << ui->lineEdit_moc_desc->text() << QString::number(tipo_voto);
            mocion << ui->lineEdit_moc_opc1->text() << ui->lineEdit_moc_opc2->text();
            mocion << ui->lineEdit_moc_opc3->text() << ui->lineEdit_moc_opc4->text();
            mocion << ui->lineEdit_moc_opc5->text();
            moc->ing_moc(&mocion);
            break;}
    }

    show_msg("La mocion se ha guardado satisfactoriamente");

    ui->widget_ing_moc->hide();
    ui->widget_propuestas->show();
    disconnect(ui->comboBox_moc_submocion,SIGNAL(currentIndexChanged(int)),this,SLOT(show_sub_moc()));
}

void NC::cancel_moc_button(){
    ui->widget_ing_moc->hide();
    ui->widget_propuestas->show();
    disconnect(ui->comboBox_moc_submocion,SIGNAL(currentIndexChanged(int)),this,SLOT(show_sub_moc()));
}

void NC::show_moc_opc3(){
    if(ui->checkBox_moc_opc3->isChecked()){
        tipo_voto=3;
        ui->lineEdit_moc_opc3->setEnabled(true);
        ui->lineEdit_moc_opc3->setStyleSheet("background-color:white; color:black;");
        ui->checkBox_moc_opc4->show();
        ui->lineEdit_moc_opc4->show();
        ui->lineEdit_moc_opc4->setEnabled(false);
        ui->checkBox_moc_opc4->setChecked(false);
        ui->lineEdit_moc_opc4->setStyleSheet("background-color:rgba(153, 155, 255, 100);");}
    else{
        tipo_voto=2;
        ui->lineEdit_moc_opc3->setEnabled(false);
        //ui->lineEdit_prop_opc3->clear();
        ui->lineEdit_moc_opc3->setStyleSheet("background-color:rgba(153, 155, 255, 100);");

        ui->checkBox_moc_opc4->setChecked(false);
        //ui->lineEdit_prop_opc4->clear();
        ui->checkBox_moc_opc4->hide();
        ui->lineEdit_moc_opc4->hide();

        ui->checkBox_moc_opc5->setChecked(false);
        //ui->lineEdit_prop_opc5->clear();
        ui->checkBox_moc_opc5->hide();
        ui->lineEdit_moc_opc5->hide();}
}

void NC::show_moc_opc4(){
    if(ui->checkBox_moc_opc4->isChecked()){
        tipo_voto=4;
        ui->lineEdit_moc_opc4->setEnabled(true);
        ui->lineEdit_moc_opc4->setStyleSheet("background-color:white; color:black;");

        ui->checkBox_moc_opc5->show();
        ui->lineEdit_moc_opc5->show();
        ui->lineEdit_moc_opc5->setEnabled(false);
        ui->checkBox_moc_opc5->setChecked(false);
        ui->lineEdit_moc_opc5->setStyleSheet("background-color:rgba(153, 155, 255, 100);");}
    else{
        tipo_voto=3;
        ui->lineEdit_moc_opc4->setEnabled(false);
        //ui->lineEdit_moc_opc4->clear();
        ui->lineEdit_moc_opc4->setStyleSheet("background-color:rgba(153, 155, 255, 100);");

        ui->checkBox_moc_opc5->setChecked(false);
        //ui->lineEdit_moc_opc5->clear();
        ui->checkBox_moc_opc5->hide();
        ui->lineEdit_moc_opc5->hide();}
}

void NC::show_moc_opc5(){
    if(ui->checkBox_moc_opc5->isChecked()){
        tipo_voto=5;
        ui->lineEdit_moc_opc5->setEnabled(true);
        ui->lineEdit_moc_opc5->setStyleSheet("background-color:white; color:black;");}
    else{
        tipo_voto=4;
        ui->lineEdit_moc_opc5->setEnabled(false);
        //ui->lineEdit_moc_opc5->clear();
        ui->lineEdit_moc_opc5->setStyleSheet("background-color:rgba(153, 155, 255, 100);");}
}

void NC::opciones_moc()
{
    if(ui->radioButton_moc_otras->isChecked()){
        tipo_voto=2;
        ui->label_moc_opc1->show();
        ui->lineEdit_moc_opc1->show();
        ui->lineEdit_moc_opc2->show();
        ui->label_moc_opc2->show();
        ui->checkBox_moc_opc3->show();
        ui->checkBox_moc_opc3->setChecked(false);
        ui->lineEdit_moc_opc3->show();
        ui->lineEdit_moc_opc3->setEnabled(false);
        ui->lineEdit_moc_opc3->setStyleSheet("background-color:rgba(153, 155, 255, 100);");
    }
}

void NC::favor_moc(){
    if(ui->radioButton_moc_favor_contra->isChecked()){
        tipo_voto=1;
        ui->lineEdit_moc_opc1->clear();
        ui->lineEdit_moc_opc2->clear();
        ui->lineEdit_moc_opc3->clear();
        ui->lineEdit_moc_opc4->clear();
        ui->lineEdit_moc_opc5->clear();
        ui->label_moc_opc1->hide();
        ui->lineEdit_moc_opc1->hide();
        ui->label_moc_opc2->hide();
        ui->lineEdit_moc_opc2->hide();
        ui->lineEdit_moc_opc3->hide();
        ui->checkBox_moc_opc3->hide();
        ui->lineEdit_moc_opc4->hide();
        ui->checkBox_moc_opc4->hide();
        ui->lineEdit_moc_opc5->hide();
        ui->checkBox_moc_opc5->hide();
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de fusión de propuestas
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_fusion_prop(){
    ui->widget_propuestas->hide();
    ui->widget_fusion->show();

    ui->radioButton_fus_prop->setChecked(true);
    fusion_prop_radioButton();

    ui->listWidget_fusion_fusionar->setEnabled(false);
    chk_listWidgets();

    connect(ui->button_fusion_cancelar,SIGNAL(clicked()),this,SLOT(fusion_cancelar_button()),Qt::UniqueConnection);
    connect(ui->button_fusion_agregar,SIGNAL(clicked()),this,SLOT(fusion_agregar_button()),Qt::UniqueConnection);
    connect(ui->button_fusion_eliminar,SIGNAL(clicked()),this,SLOT(fusion_eliminar_button()),Qt::UniqueConnection);
    connect(ui->radioButton_fus_prop,SIGNAL(clicked()),this,SLOT(fusion_prop_radioButton()),Qt::UniqueConnection);
    connect(ui->radioButton_fus_moc,SIGNAL(clicked()),this,SLOT(fusion_moc_radioButton()),Qt::UniqueConnection);
    connect(ui->button_fusion_fusionar,SIGNAL(clicked()),this,SLOT(fusion_fusionar_button()),Qt::UniqueConnection);
}

void NC::fusion_cancelar_button(){
    int i;
    i=ui->listWidget_fusion_fusionar->count();
    ui->widget_propuestas->show();
    ui->widget_fusion->hide();
    ui->listWidget_fusion_fusionar->clear();
    ui->listWidget_fusion_prop->clear();
    ui->listWidget_fusion_prop->clearSelection();
    ui->button_fusion_agregar->setEnabled(true);
}

void NC::fusion_agregar_button(){
    ui->listWidget_fusion_fusionar->addItem(ui->listWidget_fusion_prop->takeItem(ui->listWidget_fusion_prop->currentRow()));
    ui->listWidget_fusion_fusionar->sortItems(Qt::AscendingOrder);
    ui->listWidget_fusion_prop->setCurrentRow(-1);
    chk_listWidgets();
}

void NC::fusion_eliminar_button(){
    ui->listWidget_fusion_prop->addItem(ui->listWidget_fusion_fusionar->takeItem(ui->listWidget_fusion_fusionar->currentRow()));
    ui->listWidget_fusion_prop->sortItems(Qt::AscendingOrder);
    ui->listWidget_fusion_fusionar->setCurrentRow(-1);
    chk_listWidgets();
}

void NC::chk_listWidgets(){
    if(ui->listWidget_fusion_prop->count()==0){
        ui->button_fusion_agregar->setEnabled(false);
        ui->listWidget_fusion_prop->setEnabled(false);}
    else{
        ui->button_fusion_agregar->setEnabled(true);
        ui->listWidget_fusion_prop->setEnabled(true);}

    if(ui->listWidget_fusion_fusionar->count()==0){
        ui->button_fusion_eliminar->setEnabled(false);
        ui->listWidget_fusion_fusionar->setEnabled(false);}
    else{
        ui->button_fusion_eliminar->setEnabled(true);
        ui->listWidget_fusion_fusionar->setEnabled(true);}
}

void NC::fusion_fusionar_button(){
    if(ui->listWidget_fusion_fusionar->count()<2){
        show_msg("La fusion solo se puede realizar con 2 o mas<br>propuestas o mociones",
                 "Agregue mas mociones o propuestas a la lista de propuestas o mociones que desea fusionar");
        return;
    }

    if(ui->listWidget_fusion_fusionar->selectedItems().isEmpty()){
        show_msg("Seleccione una de las opciones que desea fusionar!",
                 "",
                 "Cuando se fusionan mociones o propuestas, se debe escoger una de las mociones o propuestas que se desean fusionar para que sirva como base para la propuesta fusionada. Esto implica que se mantendra la numeracion y la descripcion de esta opcion en la propuesta o mocion fusionada resultante. Si desea modificar la propuesta o fusion fusionada, dirijase a la opcion de Propuesta o Mocion respectivamente");
        return;
    }

    for(int i = 0;i<ui->listWidget_fusion_fusionar->count();i++){
        if(ui->listWidget_fusion_fusionar->selectedItems().at(0)!=ui->listWidget_fusion_fusionar->item(i)){
            if(ui->radioButton_fus_prop->isChecked()){
                prop->del_prop(ui->listWidget_fusion_fusionar->item(i)->text());
                }
            else if(ui->radioButton_fus_moc->isChecked()){
                moc->del_moc(ui->listWidget_fusion_fusionar->item(i)->text());}

        }
    }
    ui->listWidget_fusion_fusionar->clear();
    if(ui->radioButton_fus_prop->isChecked()){
        fusion_prop_radioButton();
        show_msg("Las propuestas han sido fusionadas");
        }
    else{
        fusion_moc_radioButton();
        show_msg("Las mociones han sido fusionadas");
        }
}

void NC::fusion_prop_radioButton(){
    if(ui->radioButton_fus_prop->isChecked()){
        QStringList buffer;
        ui->listWidget_fusion_prop->clear();
        prop->get_prop(buffer,"voted='no'");
        ui->listWidget_fusion_prop->insertItems(0,buffer);
        ui->listWidget_fusion_fusionar->clear();
        chk_listWidgets();
    }
}

void NC::fusion_moc_radioButton(){
    if(ui->radioButton_fus_moc->isChecked()){
        QStringList buffer;
        ui->listWidget_fusion_prop->clear();
        moc->get_moc(buffer,"voted='no'");
        ui->listWidget_fusion_prop->insertItems(0,buffer);
        ui->listWidget_fusion_fusionar->clear();
        chk_listWidgets();
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de división de propuesta
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_div_prop(){
    ui->widget_propuestas->hide();
    ui->widget_dividir->show();

    ui->radioButton_div_prop->setChecked(true);
    div_prop_RadioButton();

    connect(ui->button_div_cancelar,SIGNAL(clicked()),this,SLOT(div_cancelar_button()),Qt::UniqueConnection);
    connect(ui->button_div_dividir,SIGNAL(clicked()),this,SLOT(div_dividir_button()),Qt::UniqueConnection);
    connect(ui->radioButton_div_prop,SIGNAL(toggled(bool)),this,SLOT(div_prop_RadioButton()),Qt::UniqueConnection);
    connect(ui->radioButton_div_moc,SIGNAL(toggled(bool)),this,SLOT(div_moc_RadioButton()),Qt::UniqueConnection);
}

void NC::div_cancelar_button(){
    ui->widget_propuestas->show();
    ui->widget_dividir->hide();
}

void NC::div_dividir_button(){
    if(ui->radioButton_div_prop->isChecked()){
        prop->div_prop(ui->comboBox_div_prop->currentText(),ui->spinBox_dividir->value());
        div_prop_RadioButton();
        show_msg("La propuesta ha sido dividida!");
    }
    else if(ui->radioButton_div_moc->isChecked()){
        moc->div_moc(ui->comboBox_div_prop->currentText(),ui->spinBox_dividir->value());
        div_moc_RadioButton();
        show_msg("La mocion ha sido dividida!");
    }
}

void NC::div_prop_RadioButton(){
    if(ui->radioButton_div_prop->isChecked()){
        QStringList buffer;
        ui->comboBox_div_prop->clear();
        prop->get_prop(buffer,"voted='no'");
        ui->comboBox_div_prop->insertItems(0,buffer);
    }
}

void NC::div_moc_RadioButton(){
    if(ui->radioButton_div_moc->isChecked()){
        QStringList buffer;
        ui->comboBox_div_prop->clear();
        moc->get_moc(buffer,"voted='no'");
        ui->comboBox_div_prop->insertItems(0,buffer);
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de eliminar propuesta
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_elim_prop(){
    ui->widget_propuestas->hide();
    ui->widget_eliminar->show();

    ui->comboBox_elim_prop->clear();

    ui->radioButton_elim_prop->setChecked(true);
    elim_prop_RadioButton();

    connect(ui->button_elim_regresar,SIGNAL(clicked()),this,SLOT(elim_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_elim_eliminar,SIGNAL(clicked()),this,SLOT(elim_eliminar_button()),Qt::UniqueConnection);
    connect(ui->radioButton_elim_prop,SIGNAL(clicked()),this,SLOT(elim_prop_RadioButton()),Qt::UniqueConnection);
    connect(ui->radioButton_elim_moc,SIGNAL(clicked()),this,SLOT(elim_moc_RadioButton()),Qt::UniqueConnection);
}

void NC::elim_regresar_button(){
    ui->widget_propuestas->show();
    ui->widget_eliminar->hide();
}

void NC::elim_eliminar_button(){
    if(ui->radioButton_elim_prop->isChecked()){
        prop->del_prop(ui->comboBox_elim_prop->currentText());
        elim_prop_RadioButton();
        show_msg("La propuesta ha sido borrada");
        }
    else if(ui->radioButton_elim_moc->isChecked()){
        moc->del_moc(ui->comboBox_elim_prop->currentText());
        elim_moc_RadioButton();
        show_msg("La mocion ha sido borrada");}
}

void NC::elim_prop_RadioButton(){
    if(ui->radioButton_elim_prop->isChecked()){
        QStringList buffer;
        ui->comboBox_elim_prop->clear();
        prop->get_prop(buffer,"voted='no'");
        ui->comboBox_elim_prop->insertItems(0,buffer);
    }
}

void NC::elim_moc_RadioButton(){
    if(ui->radioButton_elim_moc->isChecked()){
        QStringList buffer;
        ui->comboBox_elim_prop->clear();
        moc->get_moc(buffer,"voted='no'");
        ui->comboBox_elim_prop->insertItems(0,buffer);
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SLOTs y funciones del menu de Control del Padrón
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de Ingreso del Padron
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_ing_padron(){
    ui->widget_padron->hide();
    ui->widget_ing_padron->show();

    ui->lineEdit_ing_padron_ID->clear();
    ui->lineEdit_ing_padron_nombre->clear();
    ui->lineEdit_ing_padron_RFTag->clear();
    P->Visualiza_padron_general(ui->tableView_padron);

    connect(ui->button_ing_padron_regresar,SIGNAL(clicked()),this,SLOT(padron_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_ing_padron_agregar,SIGNAL(clicked()),this,SLOT(padron_agregar()),Qt::UniqueConnection);
    connect(ui->button_ing_padron_borrar_padron,SIGNAL(clicked()),this,SLOT(padron_borrar_padron()),Qt::UniqueConnection);
    connect(ui->button_ing_padron_borrar_asamb,SIGNAL(clicked()),this,SLOT(padron_borrar_asambleista()),Qt::UniqueConnection);
    connect(ui->lineEdit_ing_padron_ID,SIGNAL(returnPressed()),this,SLOT(padron_agregar()),Qt::UniqueConnection);
    connect(ui->lineEdit_ing_padron_nombre,SIGNAL(returnPressed()),this,SLOT(padron_agregar()),Qt::UniqueConnection);
    connect(ui->lineEdit_ing_padron_RFTag,SIGNAL(returnPressed()),this,SLOT(padron_agregar()),Qt::UniqueConnection);

}

void NC::padron_agregar(){
    if(ui->lineEdit_ing_padron_ID->text().isEmpty()||
       ui->lineEdit_ing_padron_nombre->text().isEmpty()||
       ui->lineEdit_ing_padron_RFTag->text().isEmpty())
        show_msg("Debe ingresar todos los parametros!");
    else if(P->ing_manual_padron_general(ui->tableView_padron,ui->lineEdit_ing_padron_ID,ui->lineEdit_ing_padron_nombre,ui->lineEdit_ing_padron_RFTag)){
        ui->lineEdit_ing_padron_ID->clear();
        ui->lineEdit_ing_padron_nombre->clear();
        ui->lineEdit_ing_padron_RFTag->clear();
        ui->lineEdit_ing_padron_ID->setFocus();
    }
}

void NC::padron_borrar_asambleista(){
    if(!ui->tableView_padron->currentIndex().isValid()){
        show_msg("No ha seleccionado ningun asambleista");
        return;
    }
    P->borra_asambleista(ui->tableView_padron->currentIndex().data().toString(),ui->tableView_padron->currentIndex().column());
    P->Visualiza_padron_general(ui->tableView_padron);
}

void NC::padron_borrar_padron(){
    P->borra_padron_general(ui->tableView_padron);
}

void NC::padron_regresar_button(){
    ui->widget_padron->show();
    ui->widget_ing_padron->hide();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de Registro de asambleistas
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_registro_asambleista(){
    ui->widget_padron->hide();
    ui->widget_registro->show();
    ui->comboBox_registro_parametro->clear();
    ui->comboBox_registro_parametro->insertItems(0,QStringList()<<"ID"<<"Nombre"<<"RFTag");
    registro_cambio_label();
    connect(ui->button_registro_regresar,SIGNAL(clicked()),this,SLOT(registro_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_registro_entrada,SIGNAL(clicked()),this,SLOT(registro_entrada_button()),Qt::UniqueConnection);
    connect(ui->button_registro_salida,SIGNAL(clicked()),this,SLOT(registro_salida_button()),Qt::UniqueConnection);
    connect(ui->comboBox_registro_parametro,SIGNAL(currentIndexChanged(int)),this,SLOT(registro_cambio_label()),Qt::UniqueConnection);
}

void NC::registro_regresar_button(){
    ui->widget_padron->show();
    ui->widget_registro->hide();
}

void NC::registro_entrada_button(){
    QString pin;
    if(!P->entrada_asambleista(ui->lineEdit_registro_parametro->text(),ui->comboBox_registro_parametro->currentIndex(),pin)){
        show_msg("Lo sentimos, no se puede registrar su entrada!",
                 QString("Ingrese nuevamente su %1 o compruebe que se encuentra correctamente inscrito en el padron").arg(ui->comboBox_registro_parametro->currentText()),"",
                 QMessageBox::Critical);
    }
    else
        show_msg("Bienvenido(a) estimado(a) asambleista",
                 QString("Su pin de seguridad es <b><big>%1</b>").arg(pin));
    ui->lineEdit_registro_parametro->clear();
    ui->lineEdit_registro_parametro->setFocus();

}

void NC::registro_salida_button(){
    switch(P->salida_asambleista(ui->lineEdit_registro_parametro->text(),ui->comboBox_registro_parametro->currentIndex())){
    case 1:
        show_msg("Se ha registrado su salida");
        break;
    case -1:
        show_msg("El asambleista no se ha registrado aun!");
        break;
    case -2:
        show_msg(QString("El %1 no representa a ningun asambleista!").arg(ui->comboBox_registro_parametro->currentText()));
        break;
        }
    ui->lineEdit_registro_parametro->clear();
    ui->lineEdit_registro_parametro->setFocus();
}

void NC::registro_cambio_label(){
    ui->label_registro_ing_parametro->setText(QString("Ingrese su ").append(ui->comboBox_registro_parametro->currentText().toLower()));
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOT para reiniciar la session de la asamblea
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void NC::reiniciar_sesion(){
    switch(show_msg("Esta accion hace que todos los asambleistas<br>"
                    "tengan que registrarse nuevamente",
                    "Esta seguro que desea reiniciar la sesion?","",
                    QMessageBox::Question,QMessageBox::No | QMessageBox::Yes)){
        case QMessageBox::No:
            break;
        case QMessageBox::Yes:
            P->reiniciar_sesion();
            show_msg("Se reiniciado la sesion!","Todos los asambleistas deben registrarse nuevamente");
            break;
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SLOTs y funciones del menu de Control de Votaciones
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de activación de votaciones
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_activar(){

    ui->widget_Activar->show();
    ui->widget_votaciones->hide();

    ui->radioButton_act_prop->setChecked(true);
    act_prop_radioButton();

    ui->button_act_finalizar->setEnabled(false);
    server = new sve_network();

    connect(ui->button_act_regresar,SIGNAL(clicked()),this,SLOT(act_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_act_iniciar,SIGNAL(clicked()),this,SLOT(act_iniciar_button()),Qt::UniqueConnection);
    connect(ui->button_act_finalizar,SIGNAL(clicked()),this,SLOT(act_fin_button()),Qt::UniqueConnection);
    connect(ui->radioButton_act_moc,SIGNAL(clicked()),this,SLOT(act_moc_radioButton()),Qt::UniqueConnection);
    connect(ui->radioButton_act_prop,SIGNAL(clicked()),this,SLOT(act_prop_radioButton()),Qt::UniqueConnection);
}

void NC::act_iniciar_button(){
    ui->widget_Activar->setCursor(Qt::WaitCursor);
    if(ui->comboBox_act_prop->currentIndex()!=-1){

        if(ui->radioButton_act_prop->isChecked()){
            if(!server->open_server()){
                ui->widget_Activar->setCursor(Qt::ArrowCursor);
                return;
            }

            QString prop_file(ui->comboBox_act_prop->currentText());
            prop_file.remove(prop_file.indexOf(":"),prop_file.size()-1);
            prop_file.replace(" ","_");

            QDir Dir_prop(QDir::currentPath());
            Dir_prop.mkdir(prop_file);
            Dir_prop.cd(prop_file);

            // Crea el Key Generator, Ballot Generator, el Counter y el PVID authority para la propuesta que se va a votar

            KG=new key_generator(Dir_prop.absolutePath());
            BG=new ballot_generator(Dir_prop.absolutePath());
            C= new Counter(Dir_prop.absolutePath());

            if(!P->crea_padron_propuesta(Dir_prop.absolutePath())){
                ui->widget_Activar->setCursor(Qt::ArrowCursor);
                server->close_server();
                ui->widget_Activar->setCursor(Qt::ArrowCursor);
                return;
            }


            if(QFile::exists(KG->obj_Dir.absoluteFilePath("eb"))){
                QFile::remove(KG->obj_Dir.absoluteFilePath("eb"));
            }

            if(QFile::exists(BG->obj_Dir.absoluteFilePath("ek"))){
                QFile::remove(BG->obj_Dir.absoluteFilePath("ek"));
            }

            QFile::copy(KG->obj_Dir.absoluteFilePath("ek"),BG->obj_Dir.absoluteFilePath("ek"));
            QFile::copy(BG->obj_Dir.absoluteFilePath("eb"),KG->obj_Dir.absoluteFilePath("eb"));

            // Carga los datos de la propuesta que se desea votar en el Ballot Generator

            prop_file=ui->comboBox_act_prop->currentText();

            QString num_prop,sub_prop;
            int num_size,sub_size;

            prop_file.remove(0,10);

            num_size = prop_file.indexOf("-");
            sub_size = prop_file.indexOf(":");

            if(num_size==-1 || num_size>sub_size){
                for(int j=0;j<sub_size; j++){
                    num_prop.append(prop_file.at(j));
                }
            }
            else if(num_size<sub_size){
                    for(int j=0;j<num_size; j++){
                        num_prop.append(prop_file.at(j));
                    }
                    prop_file.remove(0,num_size+1);
                    sub_size = prop_file.indexOf(":");
                    for(int g=0;g<sub_size; g++){
                        sub_prop.append(prop_file.at(g));
                    }
            }

            QStringList propList;
            if(sub_prop.isEmpty())
                prop->propuesta(num_prop,propList);
            else
                prop->subpropuesta(num_prop,sub_prop,propList);

            BG->prop.num_prop=num_prop;
            BG->prop.sub_prop=sub_prop;
            BG->prop.desc_prop=propList.at(1);
            BG->prop.tipo_voto=propList.at(2);
            BG->prop.opc1_desc=propList.at(3);
            BG->prop.opc2_desc=propList.at(4);
            BG->prop.opc3_desc=propList.at(5);
            BG->prop.opc4_desc=propList.at(6);
            BG->prop.opc5_desc=propList.at(7);
            BG->prop.misc="";

            // Conexiones
            connect(server->tcpServer,SIGNAL(newConnection()),server,SLOT(voting_Connection()));
            connect(server,SIGNAL(M1_signal()),this,SLOT(req_Ballot()),Qt::UniqueConnection);
            connect(server,SIGNAL(M6_signal()),this,SLOT(save_vote()),Qt::UniqueConnection);

            ui->comboBox_act_prop->setEnabled(false);
            ui->button_act_iniciar->setEnabled(false);
            ui->button_act_finalizar->setEnabled(true);
        }
        else if(ui->radioButton_act_moc->isChecked()){
            if(!server->open_server()){
                ui->widget_Activar->setCursor(Qt::ArrowCursor);
                return;
            }
            QString moc_file(ui->comboBox_act_prop->currentText());
            moc_file.remove(moc_file.indexOf(":"),moc_file.size()-1);
            moc_file.replace(" ","_");

            QDir Dir_moc(QDir::currentPath());
            Dir_moc.mkdir(moc_file);
            Dir_moc.cd(moc_file);

            // Crea el Key Generator, Ballot Generator, el Counter y el PVID authority para la propuesta que se va a votar

            KG=new key_generator(Dir_moc.absolutePath());
            BG=new ballot_generator(Dir_moc.absolutePath());
            C= new Counter(Dir_moc.absolutePath());

            if(!P->crea_padron_propuesta(Dir_moc.absolutePath())){
                ui->widget_Activar->setCursor(Qt::ArrowCursor);
                return;
            }

            if(QFile::exists(KG->obj_Dir.absoluteFilePath("eb"))){
                QFile::remove(KG->obj_Dir.absoluteFilePath("eb"));
            }

            if(QFile::exists(BG->obj_Dir.absoluteFilePath("ek"))){
                QFile::remove(BG->obj_Dir.absoluteFilePath("ek"));
            }

            QFile::copy(KG->obj_Dir.absoluteFilePath("ek"),BG->obj_Dir.absoluteFilePath("ek"));
            QFile::copy(BG->obj_Dir.absoluteFilePath("eb"),KG->obj_Dir.absoluteFilePath("eb"));

            // Carga los datos de la propuesta que se desea votar en el Ballot Generator

            moc_file=ui->comboBox_act_prop->currentText();

            QString num_moc,sub_moc;
            int num_size,sub_size;

            moc_file.remove(0,7);

            num_size = moc_file.indexOf("-");
            sub_size = moc_file.indexOf(":");

            if(num_size==-1 || num_size>sub_size){
                for(int j=0;j<sub_size; j++){
                    num_moc.append(moc_file.at(j));
                }
            }
            else if(num_size<sub_size){
                    for(int j=0;j<num_size; j++){
                        num_moc.append(moc_file.at(j));
                    }
                    moc_file.remove(0,num_size+1);
                    sub_size = moc_file.indexOf(":");
                    for(int g=0;g<sub_size; g++){
                        sub_moc.append(moc_file.at(g));
                    }
            }

            QStringList mocList;
            if(sub_moc.isEmpty())
                moc->mocion(num_moc,mocList);
            else
                moc->submocion(num_moc,sub_moc,mocList);

            BG->prop.num_prop=num_moc;
            BG->prop.sub_prop=sub_moc;
            BG->prop.desc_prop=mocList.at(1);
            BG->prop.tipo_voto=mocList.at(2);
            BG->prop.opc1_desc=mocList.at(3);
            BG->prop.opc2_desc=mocList.at(4);
            BG->prop.opc3_desc=mocList.at(5);
            BG->prop.opc4_desc=mocList.at(6);
            BG->prop.opc5_desc=mocList.at(7);
            BG->prop.misc=QString("Mocion de ").append(mocList.at(8));

            // Conexiones
            connect(server->tcpServer,SIGNAL(newConnection()),server,SLOT(voting_Connection()));
            connect(server,SIGNAL(M1_signal()),this,SLOT(req_Ballot()),Qt::UniqueConnection);
            connect(server,SIGNAL(M6_signal()),this,SLOT(save_vote()),Qt::UniqueConnection);

            ui->comboBox_act_prop->setEnabled(false);
            ui->button_act_iniciar->setEnabled(false);
            ui->button_act_finalizar->setEnabled(true);
        }
    }
    else
        show_msg("No ha seleccionado ninguna propuesta o mocion!","","",QMessageBox::Warning);

    ui->widget_Activar->setCursor(Qt::ArrowCursor);
}

void NC::act_fin_button(){
    if(C->unVoted()>0){
        switch(show_msg(QString("Faltan %1 asambleistas por emitir su voto!").arg(QString::number(C->unVoted())),
                        "Desea finalizar la votacion?","",QMessageBox::Warning,QMessageBox::No|QMessageBox::Yes)){
            case QMessageBox::No:
                return;
            case QMessageBox::Yes:
                break;
        }
    }

    if(!ui->button_act_iniciar->isEnabled()){
        if(server->tcpServer->isListening()){
            ui->comboBox_act_prop->setEnabled(true);
            ui->button_act_iniciar->setEnabled(true);
            ui->button_act_finalizar->setEnabled(false);
            server->close_server();
            server->~sve_network();
            BG->~ballot_generator();
            KG->~key_generator();
            C->~Counter();

            server = new sve_network();
            if(ui->radioButton_act_prop->isChecked()){
                if(prop->isVoted(ui->comboBox_act_prop->currentText())){
                    act_prop_radioButton();
                    act_moc_radioButton();
                    return;}
            }
            else{
                if(moc->isVoted(ui->comboBox_act_prop->currentText())){
                    act_prop_radioButton();
                    act_moc_radioButton();
                    return;}
            }

            QString cmd(ui->comboBox_act_prop->currentText());
            cmd.remove(cmd.indexOf(":"),cmd.size()-1);
            cmd.replace(" ","_");
            cmd.prepend("rm -r ");
            system(cmd.toAscii().data());
        }
        disconnect(server->tcpServer,SIGNAL(newConnection()),server,SLOT(voting_Connection()));
        disconnect(server,SIGNAL(M1_signal()),this,SLOT(req_Ballot()));
        disconnect(server,SIGNAL(M6_signal()),this,SLOT(save_vote()));
    }
}

void NC::act_regresar_button(){
    if(!server->tcpServer->isListening()){
        server->~sve_network();
        ui->widget_Activar->hide();
        ui->widget_votaciones->show();
    }
    else{
        show_msg("Para salir de esta pantalla,<br>debe finalizar la votacion","","",QMessageBox::Information);
    }
}

void NC::act_moc_radioButton(){
    if(ui->radioButton_act_moc->isChecked()){
        QStringList buffer;
        ui->comboBox_act_prop->clear();
        moc->get_moc(buffer,"voted='no'");
        ui->comboBox_act_prop->insertItems(0,buffer);
    }
}

void NC::act_prop_radioButton(){
    if(ui->radioButton_act_prop->isChecked()){
        QStringList buffer;
        ui->comboBox_act_prop->clear();
        prop->get_prop(buffer,"voted='no'");
        ui->comboBox_act_prop->insertItems(0,buffer);
    }
}

void NC::req_Ballot(){
    QString m2,m4,m5,hexKey;

    if(ui->radioButton_act_prop->isChecked())
        prop->set_Voted(ui->comboBox_act_prop->currentText());

    if(ui->radioButton_act_moc->isChecked())
        moc->set_Voted(ui->comboBox_act_prop->currentText());

// envia la llave publica del Ballot Generator
    if(!BG->Key2Hex(BG->obj_Dir.absoluteFilePath("eb"),hexKey)){
        return;
        }

    server->send_msg(hexKey,*server->clientConnection);

// Envia la llave publica del Key Generator

    if(!KG->Key2Hex(KG->obj_Dir.absoluteFilePath("ek"),hexKey)){
        return;
        }

    server->send_msg(hexKey,*server->clientConnection);

// Envia la llave publica del Counter

    if(!C->Key2Hex(C->obj_Dir.absoluteFilePath("ec"),hexKey)){
        return;
        }

    server->send_msg(hexKey,*server->clientConnection);

// Lee el mensaje M1
    if (!server->read_msg(server->msg_RX,*server->clientConnection)){
        return;}

// Procesa M1 y genera M2
    if(!BG->M1(server->msg_RX,m2)){
        server->send_msg(QString::number(server->invalidM1),*server->clientConnection);
        return;}

// Procesa M2 y genera M3 y M4
    if(!KG->M2(m2,m4)){
show_msg("M2");
        server->send_msg(QString::number(server->invalidM1),*server->clientConnection);
        return;}

// Procesa M4 y genera M5
    if(!BG->M4(m4,m5)){
show_msg("M5");
        server->send_msg(QString::number(server->invalidM1),*server->clientConnection);
        return;}

    server->send_msg(QString::number(server->hearing),*server->clientConnection);
    server->send_msg(m5,*server->clientConnection);

// Lee el hash H(B,es) y lo chequea en el BGBB
    if (!server->read_msg(server->msg_RX,*server->clientConnection))
        return;

    if(BG->Search_in_BGBB(server->msg_RX))
        server->send_msg(QString::number(server->hearing),*server->clientConnection);
    else
        server->send_msg(QString::number(server->wrongHash),*server->clientConnection);

// Lee el hash H(ev,ez) y lo chequea en el KGBB
    if (!server->read_msg(server->msg_RX,*server->clientConnection))
        return;

    if(KG->Search_in_KGBB(server->msg_RX,"Hez"))
        server->send_msg(QString::number(server->hearing),*server->clientConnection);
    else
        server->send_msg(QString::number(server->wrongHash),*server->clientConnection);
}

void NC::save_vote(){
// Lee el mensaje M6
    if (!server->read_msg(server->msg_RX,*server->clientConnection)){
        return;}

// Verifica que mensaje recibido es de un votante valido y guarda su voto
    if(!C->M6(server->msg_RX)){
        server->send_msg(QString::number(server->invalidVote),*server->clientConnection);
        return;
    }

    server->send_msg(QString::number(server->voteSaved),*server->clientConnection);
    return;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOTs y funciones de la pantalla de visualización de Resultados de Votaciones
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_resultados(){
    ui->widget_resultados->show();
    ui->widget_votaciones->hide();

    ui->radioButton_result_prop->setChecked(true);
    result_prop_radioButton();

    clear_resumen();
    myPrinter =new printer(this);

    connect(ui->button_result_regresar,SIGNAL(clicked()),this,SLOT(result_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_result_resultado,SIGNAL(clicked()),this,SLOT(result_resultado_button()),Qt::UniqueConnection);
    connect(ui->button_result_imprimir_resumen,SIGNAL(clicked()),this,SLOT(result_imprimir_resumen_button()),Qt::UniqueConnection);
    connect(ui->button_result_imprimir_todo,SIGNAL(clicked()),this,SLOT(result_imprimir_informe_button()),Qt::UniqueConnection);
    connect(ui->radioButton_result_prop,SIGNAL(clicked()),this,SLOT(result_prop_radioButton()),Qt::UniqueConnection);
    connect(ui->radioButton_result_moc,SIGNAL(clicked()),this,SLOT(result_moc_radioButton()),Qt::UniqueConnection);
    connect(ui->comboBox_result_prop,SIGNAL(currentIndexChanged(int)),this,SLOT(clear_resumen()),Qt::UniqueConnection);
}

void NC::clear_resumen(){
    ui->label_result_desc1->hide();
    ui->label_result_desc2->hide();
    ui->label_result_desc3->hide();
    ui->label_result_desc4->hide();
    ui->label_result_desc5->hide();
    ui->label_result_desc_blanco->hide();

    ui->label_result_desc1->clear();
    ui->label_result_desc2->clear();
    ui->label_result_desc3->clear();
    ui->label_result_desc4->clear();
    ui->label_result_desc5->clear();

    ui->label_result_num1->hide();
    ui->label_result_num2->hide();
    ui->label_result_num3->hide();
    ui->label_result_num4->hide();
    ui->label_result_num5->hide();
    ui->label_result_num_blanco->hide();

    ui->label_result_num1->clear();
    ui->label_result_num2->clear();
    ui->label_result_num3->clear();
    ui->label_result_num4->clear();
    ui->label_result_num5->clear();
    ui->label_result_num_blanco->clear();

    ui->label_result_Total->hide();
    ui->label_result_numTotal->clear();
    ui->label_result_numTotal->hide();;
}

void NC::result_resultado_button(){
    ui->widget_Activar->setCursor(Qt::WaitCursor);
    QString opciones,resultado,buffer;
    QString desc(ui->comboBox_result_prop->currentText());

    desc.remove(desc.indexOf(":"),desc.size());
    desc.replace(" ","_");

    QDir Dir_prop(QDir::currentPath());
    Dir_prop.cd(desc);

    KG=new key_generator(Dir_prop.absolutePath(),true);
    BG=new ballot_generator(Dir_prop.absolutePath(),true);
    C= new Counter(Dir_prop.absolutePath(),true);

    BG->SubBallotList();
    KG->SubVotingKeyList();
    C->SubVoteList();

    C->Matching_dz(KG->obj_Dir.absoluteFilePath("VotingKeyList.db"));

    C->SimplifiedList();

    C->ResultsList(BG->obj_Dir.absoluteFilePath("BallotList.db"));

    if(ui->radioButton_result_prop->isChecked()){
        C->ResumenResultadosProp("propuestas.db",ui->comboBox_result_prop->currentText(),opciones,resultado);}
    else if(ui->radioButton_result_moc->isChecked()){
        C->ResumenResultadosMoc("mociones.db",ui->comboBox_result_prop->currentText(),opciones,resultado);}

    if(!opciones.isEmpty()){
        buffer = C->shift_String(opciones);
        if(buffer.size()<60)
            ui->label_result_desc1->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        else{
            ui->label_result_desc1->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
            ui->label_result_desc1->setToolTip(buffer);
        }
        ui->label_result_desc1->show();
        ui->label_result_desc1->setText(buffer);
        ui->label_result_num1->show();
        ui->label_result_num1->setText(C->shift_String(resultado));
    }

    if(!opciones.isEmpty()){
        buffer = C->shift_String(opciones);
        if(buffer.size()<60)
            ui->label_result_desc2->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        else{
            ui->label_result_desc2->setToolTip(buffer);
            ui->label_result_desc2->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
        }
        ui->label_result_desc2->show();
        ui->label_result_desc2->setText(buffer);
        ui->label_result_num2->show();
        ui->label_result_num2->setText(C->shift_String(resultado));
    }

    if(!opciones.isEmpty()){
        buffer = C->shift_String(opciones);
        if(buffer.size()<60)
            ui->label_result_desc3->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        else{
            ui->label_result_desc3->setToolTip(buffer);
            ui->label_result_desc3->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
            }
        ui->label_result_desc3->show();
        ui->label_result_desc3->setText(buffer);
        ui->label_result_num3->show();
        ui->label_result_num3->setText(C->shift_String(resultado));
    }

    if(!opciones.isEmpty()){
        buffer = C->shift_String(opciones);
        if(buffer.size()<60)
            ui->label_result_desc4->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        else{
            ui->label_result_desc4->setToolTip(buffer);
            ui->label_result_desc4->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
        }
        ui->label_result_desc4->show();
        ui->label_result_desc4->setText(buffer);
        ui->label_result_num4->show();
        ui->label_result_num4->setText(C->shift_String(resultado));
    }

    if(!opciones.isEmpty()){
        buffer = C->shift_String(opciones);
        if(buffer.size()<60)
            ui->label_result_desc5->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        else{
            ui->label_result_desc5->setToolTip(buffer);
            ui->label_result_desc5->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
        }
        ui->label_result_desc5->show();
        ui->label_result_desc5->setText(buffer);
        ui->label_result_num5->show();
        ui->label_result_num5->setText(C->shift_String(resultado));
    }

    ui->label_result_Total->show();
    ui->label_result_desc_blanco->show();
    ui->label_result_num_blanco->show();
    ui->label_result_num_blanco->setText(C->shift_String(resultado));
    ui->label_result_numTotal->show();
    ui->label_result_numTotal->setText(resultado);
    ui->widget_Activar->setCursor(Qt::ArrowCursor);
}

void NC::result_imprimir_informe_button(){
    myPrinter->imprimir_informes(ui->comboBox_result_prop->currentText());
}

void NC::result_imprimir_resumen_button(){
    if(ui->label_result_desc1->text().isEmpty()){
        show_msg("No hay resultados para imprimir!");
        return;}
    QStringList bufList;
    bufList << ajust_text(ui->comboBox_result_prop->currentText(),65);
    bufList << ajust_text(ui->label_result_desc1->text(),62) << ui->label_result_num1->text();
    bufList << ajust_text(ui->label_result_desc2->text(),62) << ui->label_result_num2->text();

    if(ui->label_result_desc3->isVisible())
        bufList << ajust_text(ui->label_result_desc3->text(),62) << ui->label_result_num3->text();
    if(ui->label_result_desc4->isVisible())
        bufList << ajust_text(ui->label_result_desc4->text(),62) << ui->label_result_num4->text();
    if(ui->label_result_desc5->isVisible())
        bufList << ajust_text(ui->label_result_desc5->text(),62) << ui->label_result_num5->text();

    bufList << "Votos en blanco" << QString::number(C->unVoted());
    bufList << "Total de votos" << ui->label_result_numTotal->text();
    myPrinter->imprimir_resumen(bufList);
}

void NC::result_regresar_button(){
    myPrinter->~printer();
    disconnect(ui->comboBox_result_prop,SIGNAL(currentIndexChanged(int)),this,SLOT(clear_resumen()));
    ui->widget_resultados->hide();
    ui->widget_votaciones->show();
}

void NC::result_moc_radioButton(){
    if(ui->radioButton_result_moc->isChecked()){
        QStringList buffer;
        ui->comboBox_result_prop->clear();
        moc->get_moc(buffer,"voted='si'");
        ui->comboBox_result_prop->insertItems(0,buffer);
    }
}

void NC::result_prop_radioButton(){
    if(ui->radioButton_result_prop->isChecked()){
        QStringList buffer;
        ui->comboBox_result_prop->clear();
        prop->get_prop(buffer,"voted='si'");
        ui->comboBox_result_prop->insertItems(0,buffer);
    }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
// SLOTs y funciones del menu de Configuración
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SLOT para restaurar la configuracion del sistema
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void NC::restaurar_sistema(){
    switch(show_msg("Esta accion restaurara la configuracion<br>"
                    "a los valores iniciales",
                    "Desea continuar con la restauracion del sistema?",
                    "La restauracion del sistema elimina los credenciales de los fiscales, el padron de asambleistas, las propuestas y mociones, los nodos de votacion autorizados y la configuracion de red",
                    QMessageBox::Warning,QMessageBox::No | QMessageBox::Yes)){
        case QMessageBox::No:
            return;
        case QMessageBox::Yes:
            break;
    }

    QString cmd("rm -r *.db");
    QDir path(QDir::currentPath());
    if(path.entryList(QStringList()<<"Propuesta_*").count()>0)
        cmd.append(" Propuesta_*");
    if(path.entryList(QStringList()<<"Mocion_*").count()>0)
        cmd.append(" Mocion_*");
    system(cmd.toAscii().data());

    QSettings settings("AIR", "SVE");
    settings.clear();

    P->~Padron();
    moc->~mociones();
    prop->~propuestas();

    P = new Padron();
    moc = new mociones();
    prop = new propuestas();

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Slots y funciones de la configuracion de intranet
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_intranet(){
    ui->widget_intranet->show();
    ui->widget_configuracion->hide();
    ui->lineEdit_intranet_IP->setDisabled(true);
    ui->lineEdit_intranet_netmask->setDisabled(true);
    server = new sve_network();
    ui->comboBox_intranet_interfaces->clear();
    ui->comboBox_intranet_interfaces->insertItems(0,server->show_interfaces());

    QSettings settings("AIR", "SVE");
    settings.beginGroup("Network");
    if(settings.contains("Interface")){
        ui->comboBox_intranet_interfaces->setCurrentIndex(ui->comboBox_intranet_interfaces->findText(settings.value("Interface").toString()));
        show_interface_info();}
    else
        ui->comboBox_intranet_interfaces->setCurrentIndex(-1);
    connect(ui->button_intranet_regresar,SIGNAL(clicked()),this,SLOT(intranet_regresar_button()),Qt::UniqueConnection);
    connect(ui->button_intranet_aceptar,SIGNAL(clicked()),this,SLOT(intranet_aceptar_button()),Qt::UniqueConnection);
    connect(ui->comboBox_intranet_interfaces,SIGNAL(currentIndexChanged(int)),this,SLOT(show_interface_info()),Qt::UniqueConnection);
}

void NC::show_interface_info(){
    disconnect(ui->comboBox_intranet_interfaces,SIGNAL(currentIndexChanged(int)),this,SLOT(show_interface_info()));
    QStringList info(server->interface_info(ui->comboBox_intranet_interfaces->currentText()));
    if(!info.isEmpty()){
        ui->lineEdit_intranet_IP->setText(info.at(0));
        ui->lineEdit_intranet_netmask->setText(info.at(1));}
    else{
        show_msg("Esta interfaz no se encuentra disponible!","Verifique que tiene conexion de red","",QMessageBox::Critical);
        ui->comboBox_intranet_interfaces->setCurrentIndex(-1);
    }
    connect(ui->comboBox_intranet_interfaces,SIGNAL(currentIndexChanged(int)),this,SLOT(show_interface_info()),Qt::UniqueConnection);
}

void NC::intranet_aceptar_button(){
    QSettings settings("AIR", "SVE");
    settings.beginGroup("Network");
    settings.setValue("Interface",ui->comboBox_intranet_interfaces->currentText());
    settings.setValue("IP",ui->lineEdit_intranet_IP->text().toAscii());
    settings.setValue("Netmask",ui->lineEdit_intranet_netmask->text().toAscii());
    settings.setValue("Port",ui->spinBox_intranet_Port->text().toAscii());
    settings.endGroup();
    server->~sve_network();
    ui->widget_intranet->hide();
    ui->widget_configuracion->show();
    ui->lineEdit_intranet_IP->clear();
    ui->lineEdit_intranet_netmask->clear();
    disconnect(ui->comboBox_intranet_interfaces,SIGNAL(currentIndexChanged(int)),this,SLOT(show_interface_info()));
}

void NC::intranet_regresar_button(){
    ui->widget_intranet->hide();
    ui->widget_configuracion->show();
    server->~sve_network();
    ui->lineEdit_intranet_IP->clear();
    ui->lineEdit_intranet_netmask->clear();
    disconnect(ui->comboBox_intranet_interfaces,SIGNAL(currentIndexChanged(int)),this,SLOT(show_interface_info()));
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Slots y funciones de la configuracion de nodos
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_nodos(){
    server = new sve_network();
    if(!server->open_server()){
        show_msg("Servidor no ha sido habilitado!","Verifique que ha seleccionado una interfaz para que trabaje el servidor");
        server->~sve_network();
        return;
    }

    ui->widget_nodos->show();
    ui->widget_configuracion->hide();

    connect(ui->button_nodo_regresar,SIGNAL(clicked()),this,SLOT(nodos_regresar_button()),Qt::UniqueConnection);
    connect(ui->lineEdit_nodos_IP,SIGNAL(returnPressed()),this,SLOT(generar_pin()),Qt::UniqueConnection);

    connect(server->tcpServer,SIGNAL(newConnection()),server,SLOT(config_Connection()));
    connect(server,SIGNAL(config_signal()),this,SLOT(verificar_config_nodos()),Qt::UniqueConnection);

}

void NC::nodos_regresar_button(){
    disconnect(server->tcpServer,SIGNAL(newConnection()),server,SLOT(config_Connection()));
    disconnect(ui->lineEdit_nodos_IP,SIGNAL(editingFinished()),this,SLOT(generar_pin()));
    server->close_server();
    server->~sve_network();
    ui->lineEdit_nodos_IP->clear();
    ui->label_nodos_pin->clear();
    ui->widget_nodos->hide();
    ui->widget_configuracion->show();
}

void NC::generar_pin(){
    if(ui->lineEdit_nodos_IP->text().isEmpty())
        return;

    if(server->chk_IP(ui->lineEdit_nodos_IP->text()))
        switch(show_msg("La IP ya se encuentra registrada!",
                        "Desea registrar nuevamente esta IP?",
                        "Al volver a registrar una IP, se generara un nuevo codigo de seguridad "
                        "que debera ser ingresado en el nodo con dicha IP. Si no ingresa el codigo "
                        "en dicho nodo, el mismo no podra conectarse al servidor",
                        QMessageBox::Warning,QMessageBox::No|QMessageBox::Yes)){
            case QMessageBox::No:
                ui->lineEdit_nodos_IP->clear();
                ui->label_nodos_pin->clear();
                return;
            case QMessageBox::Yes:
                break;
        }

    if(QHostAddress().setAddress(ui->lineEdit_nodos_IP->text())&&ui->label_nodos_pin->text().isEmpty())
        ui->label_nodos_pin->setText(QString::number(P->Random.GenerateWord32(10000000,99999999)));
    else if(ui->label_nodos_pin->text().isEmpty()){
        show_msg("La direccion IP no es valida!","","",QMessageBox::Critical);
        ui->lineEdit_nodos_IP->clear();
        ui->label_nodos_pin->clear();
    }
}

void NC::verificar_config_nodos(){
// Calcula el HMac del IP y el pin
    string output;
    HMAC<SHA> h((const byte*)ui->label_nodos_pin->text().toAscii().data(),ui->label_nodos_pin->text().size());
    byte abMac[h.DIGESTSIZE];
    QHostAddress IP(ui->lineEdit_nodos_IP->text());
    h.CalculateDigest(abMac,(const byte*)IP.toString().toAscii().data(),IP.toString().size());
    HexEncoder enc(new StringSink(output));
    enc.Put(abMac, h.DIGESTSIZE);
    enc.MessageEnd();

    if(QString::fromStdString(output)!=server->msg_RX){
        server->send_msg(QString::number(server->invalidID),*server->clientConnection);
        ui->widget_nodos->setCursor(Qt::ArrowCursor);
        show_msg("Fallo de verificacion",
                 QString("Verifique que solo el nodo con la IP = %1 este transmitiendo,"
                         " y que haya ingresado correctamente el codigo de seguridad en"
                         " el nodo").arg(ui->lineEdit_nodos_IP->text()),"",QMessageBox::Critical);
        return;
    }
    server->send_msg(QString::number(server->hearing),*server->clientConnection);
    ui->widget_nodos->setCursor(Qt::ArrowCursor);
    server->reg_nodo(ui->lineEdit_nodos_IP->text(),QString::fromStdString(output));
    ui->label_nodos_pin->clear();
    ui->lineEdit_nodos_IP->clear();
    ui->lineEdit_nodos_IP->setFocus();
    show_msg("Nodo registrado correctamente!");
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Slots y funciones de la pantalla de asignación de fiscales
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void NC::conex_fiscales(){
    ui->widget_fiscales->show();
    ui->widget_configuracion->hide();

    QSettings settings("AIR", "SVE");
    settings.beginGroup("Fiscal1");
    if(settings.contains("nombre")){
        ui->lineEdit_fiscal1_nombre->setText(settings.value("nombre").toString());
        ui->lineEdit_fiscal1_cedula->setText(settings.value("cedula").toString());
        ui->lineEdit_fiscal1_RFTag->setText(settings.value("RFTag").toString());
    }
    settings.endGroup();
    settings.beginGroup("Fiscal2");
    if(settings.contains("nombre")){
        ui->lineEdit_fiscal2_nombre->setText(settings.value("nombre").toString());
        ui->lineEdit_fiscal2_cedula->setText(settings.value("cedula").toString());
        ui->lineEdit_fiscal2_RFTag->setText(settings.value("RFTag").toString());
    }

    connect(ui->button_fiscal_cancelar,SIGNAL(clicked()),this,SLOT(fiscal_cancelar_button()),Qt::UniqueConnection);
    connect(ui->button_fiscal_aceptar,SIGNAL(clicked()),this,SLOT(fiscal_aceptar_button()),Qt::UniqueConnection);
}

void NC::fiscal_cancelar_button(){
    ui->widget_fiscales->hide();
    ui->widget_configuracion->show();
}

void NC::fiscal_aceptar_button(){

    if(ui->lineEdit_fiscal1_nombre->text().isEmpty()&&ui->lineEdit_fiscal1_cedula->text().isEmpty()&&
       ui->lineEdit_fiscal1_RFTag->text().isEmpty()&&ui->lineEdit_fiscal1_password->text().isEmpty()&&
       ui->lineEdit_fiscal1_chk_password->text().isEmpty()){
        switch(show_msg("No ha ingresado ningun dato!","Desea deshabilitar el inicio de sesion seguro?",
                        "El inicio de sesion seguro restringe el acceso de personas no autorizadas"
                        " a este equipo. Al deshabilitar esta opcion, cualquier persona puede manipular"
                        " la informacion contenido este equipo",QMessageBox::Warning,QMessageBox::No|QMessageBox::Yes)){
            case QMessageBox::No:
                return;
            case QMessageBox::Yes:
                break;
        }
    }
    else if(ui->lineEdit_fiscal1_nombre->text().isEmpty()||ui->lineEdit_fiscal1_cedula->text().isEmpty()||
            ui->lineEdit_fiscal1_RFTag->text().isEmpty()||ui->lineEdit_fiscal1_password->text().isEmpty()||
            ui->lineEdit_fiscal1_chk_password->text().isEmpty()){
        show_msg("Error al guardar los datos del fiscal 1!",
                 "Para configurar la cuenta de un fiscal debe ingresar todos los datos requeridos, "
                 "o dejar todos los espacios en blanco y así dejar el acceso libre.","",QMessageBox::Warning);
        return;
    }

    if(ui->lineEdit_fiscal2_nombre->text().isEmpty()&&ui->lineEdit_fiscal2_cedula->text().isEmpty()&&
       ui->lineEdit_fiscal2_RFTag->text().isEmpty()&&ui->lineEdit_fiscal2_password->text().isEmpty()&&
       ui->lineEdit_fiscal2_chk_password->text().isEmpty()){}
    else if(ui->lineEdit_fiscal2_nombre->text().isEmpty()||ui->lineEdit_fiscal2_cedula->text().isEmpty()||
            ui->lineEdit_fiscal2_RFTag->text().isEmpty()||ui->lineEdit_fiscal2_password->text().isEmpty()||
            ui->lineEdit_fiscal2_chk_password->text().isEmpty()){
        show_msg("Error al guardar los datos del fiscal 2!",
                 "Para configurar la cuenta del fiscal 2 debe ingresar todos los datos","",QMessageBox::Warning);
        return;
    }

    QString pass1,pass2;
    if(!fiscal_check_pass_1(pass1))
        return;

    if(!fiscal_check_pass_2(pass2))
        return;

    QSettings settings("AIR", "SVE");
    settings.beginGroup("Fiscal1");
    settings.setValue("nombre",ui->lineEdit_fiscal1_nombre->text());
    settings.setValue("cedula",ui->lineEdit_fiscal1_cedula->text());
    settings.setValue("RFTag",ui->lineEdit_fiscal1_RFTag->text());
    settings.setValue("password",pass1);
    settings.endGroup();

    settings.beginGroup("Fiscal2");
    settings.setValue("nombre",ui->lineEdit_fiscal2_nombre->text());
    settings.setValue("cedula",ui->lineEdit_fiscal2_cedula->text());
    settings.setValue("RFTag",ui->lineEdit_fiscal2_RFTag->text());
    settings.setValue("password",pass2);
    settings.endGroup();

    settings.beginGroup("backdoor");
    settings.setValue("RFTag","sve-air");
    settings.setValue("password","EBV200307067");
    settings.endGroup();

    ui->widget_fiscales->hide();
    ui->widget_configuracion->show();

}

bool NC::fiscal_check_pass_1(QString &pass){
    if(ui->lineEdit_fiscal1_password->text()!=ui->lineEdit_fiscal1_chk_password->text()){
        show_msg("Las contrasenas del fiscal 1 no coinciden!","Vuelva a ingresar las contrasenas","",QMessageBox::Critical);
        ui->lineEdit_fiscal1_chk_password->clear();
        ui->lineEdit_fiscal1_password->clear();
        ui->lineEdit_fiscal1_password->setFocus();
        return false;
    }

// Genera la funcion hash del password
    SHA sha;
    string output;

    sha.Update((byte const*)ui->lineEdit_fiscal1_password->text().toAscii().data(), ui->lineEdit_fiscal1_password->text().size());

    SecByteBlock sbbDigest(sha.DigestSize());

    sha.Final(sbbDigest.begin());
    HexEncoder enc(new StringSink(output));
    enc.Put(sbbDigest.begin(), sbbDigest.size());
    enc.MessageEnd();

    pass = QString::fromStdString(output);
    return true;
}

bool NC::fiscal_check_pass_2(QString &pass){
    if(ui->lineEdit_fiscal2_password->text()!=ui->lineEdit_fiscal2_chk_password->text()){
        show_msg("Las contrasenas del fiscal 2 no coinciden!","Vuelva a ingresar las contrasenas","",QMessageBox::Critical);
        ui->lineEdit_fiscal2_chk_password->clear();
        ui->lineEdit_fiscal2_password->clear();
        ui->lineEdit_fiscal2_password->setFocus();
        return false;
    }

// Genera la funcion hash del password
    SHA sha;
    string output;

    sha.Update((byte const*)ui->lineEdit_fiscal2_password->text().toAscii().data(), ui->lineEdit_fiscal2_password->text().size());

    SecByteBlock sbbDigest(sha.DigestSize());

    sha.Final(sbbDigest.begin());
    HexEncoder enc(new StringSink(output));
    enc.Put(sbbDigest.begin(), sbbDigest.size());
    enc.MessageEnd();

    pass = QString::fromStdString(output);
    return true;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int NC::show_msg(QString message, QString info, QString detail, QMessageBox::Icon icono, QMessageBox::StandardButtons buttons){
    QMessageBox message1(this);
    message1.setStyleSheet("QAbstractButton{background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(157, 246, 227, 255), stop:1 rgba(168, 168, 168, 255)); border-top-color: rgb(233, 248, 241); border-left-color: rgb(233, 248, 241); border-bottom-color: rgb(81, 120, 107); border-right-color: rgb(81, 120, 107); border-style: outset; border-width: 2px; padding: 3px; border-radius: 15px; min-height:20 px; min-width:80 px; color: black} QAbstractButton:pressed{background-color: qlineargradient(spread:reflect, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(97, 186, 167, 255), stop:1 rgba(148, 148, 148, 255)); color: rgb(85, 0, 0); border-style: inset; border-top-color: rgb(81, 120, 107); border-left-color: rgb(81, 120, 107); border-bottom-color: rgb(233, 248, 241); border-right-color: rgb(233, 248, 241);} QLabel{color: rgb(255,255,100); background-color: rgba(170, 255, 255, 0)} QDialog{background-color: rgb(132, 150, 255);}");
    message1.setWindowModality(Qt::ApplicationModal);
    message1.setText(message.prepend("<b>").append("</b>"));
    message1.setInformativeText(info);
    message1.setDetailedText(detail);
    message1.setIcon(icono);
    message1.setStandardButtons(buttons);
    return message1.exec();
}

QString NC::ajust_text(QString data, int width){
    QString buffer,line;
    QStringList list;

    list = data.split(QRegExp("\\s+"));

    for(int i = 0;(i<list.size())|(i==1000);i++){
        if(list.at(i).size() < width && (line.size() + list.at(i).size()) < width){
            line.append(list.at(i)).append(" ");
        }
        else{
            buffer.append(line).append("\n");
            line.clear();
            line = list.at(i);
            line.append(" ");
        }
    }

    if(!line.isEmpty())
        buffer.append(line);

    return buffer;
}
